package br.com.velp.sudecap.comum;

import br.com.velp.sudecap.entidade.DireitoSistema;
import br.com.velp.sudecap.enumerator.EnumChaveValor;
import br.com.velp.sudecap.enumerator.PermissaoEnum;
import br.com.velp.sudecap.mb.contexto.ContextoBean;
import br.com.velp.sudecap.util.JsfUtil;
import br.com.velp.sudecap.web.util.MensagemUtil;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.faces.model.SelectItem;
import org.apache.commons.lang.StringUtils;
import org.primefaces.context.RequestContext;

/**
 * <sumario>
 * <objetivo>"Rastreabilidade"</objetivo>
 * <autor>EDUARDO SANTOS DE OLIVEIRA</autor>
 * <versao>1.0.0.0</versao>
 * <data_criacao> 17.10.2012 </data_criacao>
 * <data_ultima_alteracao> N/A </data_ultima_alteracao>
 * <descricao> Classe Base Para Operações Comuns Entre os Managead Beans </descricao>
 * </sumario>
 */
public class BaseController implements Serializable {

    private static final int REGISTROS_POR_PAGINA = 5;
    private static final String LINHAS_POR_PAGINA = "5, 10, 15, 20, 25, 30";

    /*
     * Responsável Por Disponibilizar Uma Coleção de SelectItens Inicializada,
     * Incluindo a Opção "Selecione"
     *
     */
    protected List<SelectItem> obterSelectItemInicializado() {
	List<SelectItem> itens = new ArrayList<SelectItem>();
	itens.add(new SelectItem(null, MensagemUtil.getMensagem("opcao_combo_selecione")));
	return itens;
    }

    /*
     * Responsável Por Popular Uma Coleção de SelectItens, Recebendo Com
     * Argumento os Seguintes Parâmetros:
     *
     * - Collection (valores) - String atributoId - String atributoDescricao
     *
     * Obs.: Inclui a Opção "Selecione"
     *
     */
    protected List<SelectItem> obterSelectItemPopulado(Collection valores, String atributoId, String atributoDescricao) {

	List<SelectItem> itens = obterSelectItemInicializado();

	try {
	    for (Object value : valores) {

		Class clazz = value.getClass();

		Field fieldId = clazz.getDeclaredField(atributoId);
		Field fieldDescricao = clazz.getDeclaredField(atributoDescricao);

		if (fieldId != null && fieldDescricao != null) {

		    fieldId.setAccessible(true);
		    fieldDescricao.setAccessible(true);

		    Long valorId = (Long) fieldId.get(value);
		    String valorDescricao = (String) fieldDescricao.get(value);

		    itens.add(new SelectItem(valorId, valorDescricao));

		}

	    }

	    return itens;

	} catch (Exception e) {
	    e.printStackTrace();
	    return itens;
	}

    }

    /*
     * Responsável Por Popular Uma Coleção de SelectItens, Recebendo Com
     * Argumento os Seguintes Parâmetros:
     *
     * - Collection<EnumChaveValor> (valores)
     *
     */
    protected List<SelectItem> obterSelectItemPopulado(boolean comSelecione, EnumChaveValor... valores) {
	List<SelectItem> selectItens = new ArrayList<SelectItem>();
	if (comSelecione) {
	    selectItens = obterSelectItemInicializado();
	}
	for (EnumChaveValor item : valores) {
	    selectItens.add(new SelectItem(item.getValue(), item.getLabel()));
	}
	return selectItens;
    }

    /**
     * Verifica se o Usuário Possui Acesso ao Módulo ou a Funcionalidade
     *
     * @param Integer codigo (Código de Acesso ao Módulo)
     *
     * @return TRUE - Caso Possua Privilégio Sobre o Módulo / Funcionalidade
     * FALSE - Caso Contrário
     *
     */
    public boolean possuiPrivilegio(String nomeFuncionalidade) {
	Long codigo = obterCodigoAcesso(nomeFuncionalidade);
	ContextoBean contexto = (ContextoBean) JsfUtil.recuperarObjetoSessao("contextoBean");
	if (contexto == null || codigo == null) {
	    return false;
	}
	for (DireitoSistema direito : contexto.getPrivilegiosUsuario()) {
	    if (direito.getId().equals(codigo)) {
		return true;
	    }
	}
	return false;
    }
    
    public void exibirPainelDialog(String nome){
	RequestContext.getCurrentInstance().execute(nome.concat(".show();"));
    }
    
    public void ocultarPainelDialog(String nome){
	RequestContext.getCurrentInstance().execute(nome.concat(".hide();"));
    }
    
    public void resetarFormulario(String formulario){
        RequestContext.getCurrentInstance().reset(formulario);  
    }

    /**
     * Recupera o Código de Acesso à Funcionalidade, 
     * de Acordo Com a Descrição do Enumerator 'PermissaoEnum'
     * 
     * @param String nomeFuncionalidade
     * 
     * return Long codigoAcesso
     */
    private Long obterCodigoAcesso(String nomeFuncionalidade) {
	if (StringUtils.isNotBlank(nomeFuncionalidade)) {
	    PermissaoEnum permissao = PermissaoEnum.valueOf(nomeFuncionalidade);
	    return permissao != null ? permissao.getValue() : null;
	} else {
	    return null;
	}
    }

    // <editor-fold desc="GETTERS AND SETTERS" defaultstate="collapsed">    
    protected ContextoBean getContexto() {
	return (ContextoBean) JsfUtil.recuperarObjetoSessao("contextoBean");
    }

    public int getRegistrosPorPagina() {
	return REGISTROS_POR_PAGINA;
    }

    public String getLinhasPorPagina() {
	return LINHAS_POR_PAGINA;
    }
    // </editor-fold>
    
}
